package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * JDK5之后，java推出了一个新特性-泛型
 * 泛型也成为参数化类型，允许一个类在使用时在指定一个类型给它，用于确定其内部某个属性的类型或方法
 * 参数的类型或返回值的类型，使用更便捷。
 * 在接种泛型广泛使用，用于规定集合中的元素类型
 */
public class InteratioDemo {
    public static void main(String[] args) {
        //Collection<String> 集合声明时定义了一个泛型E
        Collection <String> c = new ArrayList<>(); //实际使用集合时为E指定实际类型，如：String
        //add(E e) add方法的参数类型使用了集合的泛型E
        c.add("one"); //编译器会检查实参类型是否与泛型E一致
        c.add("#");
        c.add("two");
        c.add("#");
        c.add("three");
        c.add("#");
        c.add("four");
        c.add("#");
        c.add("five");
//        c.add("100"); //实参不符合方法参数泛型的实际类型则编译不通过


        /*
        迭代器有两个重要的方法：
        boolean hasNext() 判断集合是否还有下一个元素可供遍历     问
        E next()：迭代器获取下一个元素                         取
         */
        //遍历集合c
        Iterator <String> it = c.iterator(); //迭代器也支持泛型，与遍历的集合泛型一致极客
        while (it.hasNext()){
            String str = it.next();
//            System.out.println(str);
            if ("#".equals(str)){ //字符串变量与字面量equals时要讲字面量放前面，避免空指针
//                c.remove(str); //迭代器遍历过程中不允许通过集合的方法增删元素，否则会抛出异常！！
                it.remove(); //迭代器的remove不需要传递参数，删除的是本次next获取的元素
            }
        }
        System.out.println(c);
    }
}


















